#ifndef IDC_MAIN_LTE_H
#define IDC_MAIN_LTE_H
#include <stddef.h>
#include <cjson/cJSON.h>
extern int serial_fd;




typedef struct
{
    char *ate;
    char *ati;
    char cgmi[20];
    char cgmm[20];
    char gsn[100];
    char cgsn[100];
    char *qnwinfo;
    char *copn;
    char qccid[100];
    char cgpaddr[20];
    char *cgmr;
    char *gmm;
    int signalPower;
    int signalQuality;

	char cell_type[15];
    char state[10];
    char RAT[10];
    char is_tdd[10];
    int creg;
    int MCC;
    int MNC;
    long cellID;
    int PCI;
    int EARFCN;
    int freq_band_ind;
    int UL_bandwidth;
    int DL_bandwidth;
    long TAC;
    int RSRP;
    int RSRQ;
    int RSSI;
    int SINR;
    int srxlev;
    int tx_power;
    int scs;
    long bytes_sent;
    long bytes_recv;
} LteInfo;
// 定义一个结构体来存储解析后的服务小区信息
typedef struct {
    char mode[16];          // 例如 "servingcell"
    char state[16];         // 连接状态，例如 "NOCONN"
    char rat[8];            // 无线接入技术，例如 "LTE"
    char duplex_mode[8];    // 双工模式，例如 "FDD"
    int mcc;                // 移动国家代码 (460)
    int mnc;                // 移动网络代码 (00)
    unsigned int cell_id;   // 小区ID (16进制字符串转数值)
    int pci;                // 物理小区ID (101)
    int earfcn;             // 绝对射频信道号 (1300)
    int ul_bandwidth;       // 上行带宽 (3)
    int dl_bandwidth;       // 下行带宽 (5)
    int tac;                // 跟踪区域码 (5)
    int rsrp;               // 参考信号接收功率 (-66)
    int rsrq;               // 参考信号接收质量 (-9)
    int sinr;               // 信号与干扰加噪声比 (-38)
    int cqi;                // 信道质量指示 (7)
    int tx_power;           // 发射功率 (0)
    int srxlev;             // S准则值 (0)
} ServingCellInfo;


int serial_init(const char *device);
int send_at_command(int fd, const char *command, char *response_prefix, char *response, size_t response_size);
int parseQENG(const char* response, ServingCellInfo* info);



#define EC_JSON_GET_OBJ(NODE, ROOT, STR)  do { \
	NODE = cJSON_GetObjectItem(ROOT, STR); \
	if (!NODE) {return EC_FAILURE;} }while(0)

#define EC_JSON_GET_ARR(NODE, ROOT, INDEX) do{\
	NODE = cJSON_GetArrayItem(ROOT, INDEX); \
	if (!NODE) {return EC_FAILURE;} }while(0)

#define EC_GET_CONF_STR(KEY, VALUE) do {\
	if (KEY) {free (KEY); KEY=NULL;} \
	if (VALUE != NULL) {KEY=strdup (VALUE);}} while (0)

#define EC_GET_CONF_INT(KEY, VALUE) do {\
	KEY = VALUE;}while(0)

#define EP_JSON_GET_INT(ROOT, KEY, DATA) do {\
	cJSON *node = NULL; \
	EP_JSON_GET_OBJ(node, ROOT, KEY); \
	EP_GET_CONF_INT(DATA, node->valueint);}while (0)

#define EP_JSON_GET_STR(ROOT, KEY, DATA) do {\
	cJSON *node = NULL; \
	EP_JSON_GET_OBJ(node, ROOT, KEY); \
	EP_GET_CONF_STR(DATA, node->valuestring);}while(0)

#define EP_JSON_SET_INT(ROOT, KEY, VALUE) do {\
	cJSON_AddNumberToObject(ROOT, KEY, VALUE);}while(0)

#define EP_JSON_SET_STR(ROOT, KEY, VALUE) do {\
	if (VALUE) {cJSON_AddStringToObject(ROOT, KEY, VALUE);} \
	else{cJSON_AddNullToObject(ROOT, KEY);}}while(0)

#define EP_JSON_SET_BOOL(ROOT, KEY, VALUE) do {\
	cJSON_AddBoolToObject(ROOT, KEY, VALUE);}while(0)


void init_lte1_data();
void init_lte2_data();

LteInfo *read_lte1_base();
LteInfo *read_lte2_base();

int read_lte1_info(LteInfo *info);
int read_lte2_info(LteInfo *info);
#endif